package com.guomao;

import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig;
import com.guomao.entity.User;
import com.guomao.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.io.InputStream;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        // 1. 从类路径加载 MyBatis 配置文件
        try (InputStream inputStream = Main.class.getClassLoader()
                .getResourceAsStream("mybatis-config.xml")) {

            if (inputStream == null) {
                throw new RuntimeException("找不到 mybatis-config.xml 配置文件");
            }

            // 2. 配置 MyBatis-Plus 全局设置
            GlobalConfig globalConfig = new GlobalConfig();
            DbConfig dbConfig = new DbConfig();
            dbConfig.setLogicDeleteField("deleted");    // 逻辑删除字段名
            dbConfig.setLogicDeleteValue("1");          // 已删除的值
            dbConfig.setLogicNotDeleteValue("0");       // 未删除的值
            dbConfig.setIdType(com.baomidou.mybatisplus.annotation.IdType.AUTO); // 主键自增
            globalConfig.setDbConfig(dbConfig);

            // 3. 创建 SqlSessionFactory（使用 MyBatis-Plus 的构建器）
            SqlSessionFactory sqlSessionFactory = new MybatisSqlSessionFactoryBuilder()
                    .build(inputStream);

            // 4. 获取 SqlSession 并测试
            testCRUDOperations(sqlSessionFactory);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void testCRUDOperations(SqlSessionFactory sqlSessionFactory) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession(true)) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            System.out.println("=== MyBatis-Plus CRUD 测试 ===");

            // 1. 查询所有用户（自动过滤已逻辑删除的数据）
            System.out.println("\n1. 查询所有用户：");
            List<User> userList = userMapper.selectList(null);
            userList.forEach(System.out::println);

            // 2. 插入新用户
            System.out.println("\n2. 插入新用户：");
            User newUser = new User();
            newUser.setName("测试用户");
            newUser.setAddress("测试地址");
            newUser.setGender(1);
            int insertResult = userMapper.insert(newUser);
            System.out.println("插入结果：" + insertResult + "，生成的主键ID：" + newUser.getId());

            // 3. 根据ID查询
            System.out.println("\n3. 根据ID查询：");
            User user = userMapper.selectById(newUser.getId());
            System.out.println("查询结果：" + user);

            // 4. 更新用户
            System.out.println("\n4. 更新用户：");
            user.setAddress("更新后的地址");
            int updateResult = userMapper.updateById(user);
            System.out.println("更新结果：" + updateResult);

            // 5. 查询更新后的数据
            System.out.println("\n5. 查询更新后的用户：");
            User updatedUser = userMapper.selectById(user.getId());
            System.out.println("更新后结果：" + updatedUser);

            // 6. 逻辑删除
            System.out.println("\n6. 逻辑删除用户：");
            int deleteResult = userMapper.deleteById(user.getId());
            System.out.println("逻辑删除结果：" + deleteResult);

            // 7. 验证逻辑删除（应该查不到已删除的用户）
            System.out.println("\n7. 验证逻辑删除：");
            User deletedUser = userMapper.selectById(user.getId());
            System.out.println("查询已删除的用户：" + deletedUser);

            // 8. 查询剩余用户数量
            System.out.println("\n8. 查询剩余用户数量：");
            Long count = userMapper.selectCount(null);
            System.out.println("剩余用户数量：" + count);

            // 9. 条件查询示例
            System.out.println("\n9. 条件查询（性别为男的用户）：");
            List<User> maleUsers = userMapper.selectList(
                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<User>()
                            .eq("gender", 1)
            );
            maleUsers.forEach(System.out::println);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}